package cn.itcast.nems.studentrecord.service.studentrecord;


import cn.itcast.nems.studentrecord.constant.ReferenceTypeEnum;
import cn.itcast.nems.studentrecord.dao.entity.StudentRecordTransaction;
import cn.itcast.nems.studentrecord.dto.change.StudentRecordTransactionChangeCheckDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordTransactionCreateDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordTransactionDTO;
import cn.itcast.nems.studentrecord.enumeration.StudentRecordTransactionStateEnum;

import java.util.List;

/**
 * <p>
 * 学籍流转明细;“物流”：只记录有出入班的操作 服务类
 * </p>
 *
 * @author liyong
 * @since 2023-11-14
 */
public interface StudentRecordTransactionService {

    /**
     * 冲销上次进班，再生成入班流转记录
     *
     * @param createDto 新进班流转参数
     */
    void chargeAgainstInClazz(StudentRecordTransactionCreateDTO createDto);

    /**
     * 查询学员的流转记录
     *
     * @param studentId 学员ID
     * @return 流转记录
     */
    List<StudentRecordTransactionChangeCheckDTO> findStudentRecordTransactionChangeChecks(int studentId);

    /**
     * 查找最新的一条流转记录
     *
     * @param studentRecordId 学籍id
     * @param referenceType   凭单类型
     * @return 流转记录
     */
    StudentRecordTransactionDTO findLastStudentRecordTransactionDTO(String studentRecordId,
                                                                    ReferenceTypeEnum referenceType);

    /**
     * 根据凭单、班级、学员信息判断是否已经存在流转记录
     *
     * @param referenceId     凭单ID
     * @param referenceLineId 凭单行ID
     * @param clazzId         班级ID
     * @param studentId       学员ID
     * @return 是否存在流转记录
     */
    boolean exist(String referenceId, String referenceLineId, int clazzId, int studentId);

    /**
     * 创建学籍流转记录
     *
     * @param studentRecordTransactionCreate 参数
     * @return true： 成功创建 false：流程已经存在
     */
    boolean createStudentRecordTransaction(StudentRecordTransactionCreateDTO studentRecordTransactionCreate);

    /**
     * 修改流转记录状态
     *
     * @param referenceType   凭单类型
     * @param referenceLineId 凭单行ID
     * @param studentRecordId 学籍ID
     * @param state           状态
     */
    void updateState(ReferenceTypeEnum referenceType,
                     String referenceLineId,
                     String studentRecordId,
                     StudentRecordTransactionStateEnum state);
    /**
     * 根据学籍ID查询学籍流转记录表里这个学籍的最后一个出班记录
     *
     * @param studentRecordId 学籍ID
     * @return 流转记录
     */
    StudentRecordTransaction selectLastLeaveByStudentRecordId(String studentRecordId);
}
